home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / UNIX.ZIP / GUESS / CRY.C next >
C/C++ Source or Header  |  1991-02-05  |  4KB  |  244 lines

  1. /*
  2.     Fast password transform.
  3. */
  4.  
  5. #include    "fdes.h"
  6.  
  7.  
  8. extern    unsb    E[];
  9. extern    unsb    FP[];
  10. extern    void    DoSelfMod(void);
  11. extern    void  fsetkey(obpb1 *);
  12. extern    void    xform(sbpb24 *,sbpb24);
  13. extern    obpb1    LR[64];
  14. extern    obpb1    L[32];
  15. extern    obpb1    R[32];
  16.  
  17. extern    Fperm(unsb *);
  18. extern    undoe(obpb1 *, obpb1 *);
  19. extern    toBA64(sbpb24 *, obpb1 *);
  20. ebpb24    sixbitTOtf(sbpb24 sb);
  21. sbpb24    tfTOsixbit(ebpb24);
  22.  
  23.  
  24. void setname(char *pw)
  25. {
  26. reg    int  i, j, c;
  27. static    obpb1 block[66];
  28.  
  29.     for (i = 0 ; i < 66 ; i++)
  30.         block[i] = 0;
  31. #pragma warn -pia
  32.     for (i = 0 ; (c = *pw) && i < 64 ; pw++)  {
  33. #pragma warn +pia
  34.         for (j = 0 ; j < 7 ; j++, i++)
  35.             block[i] = (c >> (6 - j)) & 01;
  36.         i++;        /* Skip parity bit. */
  37.         }
  38.     
  39.     fsetkey(block);
  40.     DoSelfMod();
  41. }
  42.  
  43.  
  44. sbpb24 getsaltval(char *salt)
  45. {
  46. reg        int  i, j, c;
  47. sbpb24    saltvalue;
  48.  
  49.     saltvalue = 0;
  50.     for (i = 0 ; i < 2 ; i++)  {
  51.         c = *salt++;
  52.         if (c > 'Z')
  53.             c -= 6;
  54.         if (c > '9')
  55.             c -= 7;
  56.         c -= '.';
  57.         for (j = 0 ; j < 6 ; j++)
  58.             saltvalue |= ((c >> j) & 01) << (6 * i + j);
  59.         }
  60.     saltvalue = tfTOsixbit(saltvalue);
  61.     return saltvalue;
  62. }
  63.  
  64.  
  65. char *fcrypt(pw,salt)
  66. char *pw;
  67. char *salt;
  68. {
  69. reg        int  i, j, c;
  70. static    obpb1 block[66];
  71. static    char iobuf[16];
  72. static    sbpb24 out96[4];
  73. sbpb24    saltvalue;
  74.  
  75.     for (i = 0 ; i < 66 ; i++)
  76.         block[i] = 0;
  77. #pragma warn -pia
  78.     for (i = 0 ; (c = *pw) && i < 64 ; pw++)  {
  79. #pragma warn +pia
  80.         for (j = 0 ; j < 7 ; j++, i++)
  81.             block[i] = (c >> (6 - j)) & 01;
  82.         i++;        /* Skip parity bit. */
  83.         }
  84.  
  85.     fsetkey(block);
  86.     DoSelfMod();
  87.  
  88.     for (i = 0 ; i < 66 ; i++)
  89.         block[i] = 0;
  90.  
  91.     saltvalue = 0;
  92.     for (i = 0 ; i < 2 ; i++)  {
  93.         c = *salt++;
  94.         iobuf[i] = c;
  95.         if (c > 'Z')
  96.             c -= 6;
  97.         if (c > '9')
  98.             c -= 7;
  99.         c -= '.';
  100.         for (j = 0 ; j < 6 ; j++)
  101.             saltvalue |= ((c >> j) & 01) << (6 * i + j);
  102.         }
  103.     saltvalue = tfTOsixbit(saltvalue);
  104.  
  105.      xform(out96, saltvalue);
  106.  
  107.     toBA64(out96, block);
  108.  
  109.     for (i = 0 ; i < 11 ; i++)  {
  110.         c = 0;
  111.         for (j = 0 ; j < 6 ; j++)  {
  112.             c <<= 1;
  113.             c |= block[6 * i + j];
  114.             }
  115.         c += '.';
  116.         if (c > '9')
  117.             c += 7;
  118.         if (c > 'Z')
  119.             c += 6;
  120.         iobuf[i+2] = c;
  121.     }
  122.     iobuf[i+2] = 0;
  123.     if (iobuf[1] == 0)
  124.         iobuf[1] = iobuf[0];
  125.     return(iobuf);
  126. }
  127.  
  128.  
  129.  
  130. char *expand(sbpb24 *out96)
  131. {
  132. reg        int  i, j, c;
  133. static    obpb1 block[66];
  134. static    char iobuf[16];
  135. sbpb24    saltvalue;
  136.  
  137.     toBA64(out96, block);
  138.     
  139.     for (i = 0 ; i < 11 ; i++)  {
  140.         c = 0;
  141.         for (j = 0 ; j < 6 ; j++)  {
  142.             c <<= 1;
  143.             c |= block[6 * i + j];
  144.             }
  145.         c += '.';
  146.         if (c > '9')
  147.             c += 7;
  148.         if (c > 'Z')
  149.             c += 6;
  150.         iobuf[i+2] = c;
  151.     }
  152.     iobuf[i+2] = 0;
  153.     iobuf[0]=iobuf[1]=' ';
  154.     return(iobuf);
  155. }
  156.  
  157.  
  158.  
  159. sbpb24 flatten(char *s,sbpb24 *out96)
  160. {
  161. obpb1 block[66];
  162. obpb1    tmpE[48];
  163. sbpb24 l;
  164. int i,j,c;
  165.  
  166.     /* Inverse of final ascii mapping */
  167.     for(i=0; i<11; i++){
  168.         c = s[i+2];
  169.         if(c>='a')
  170.             c -= 6;
  171.         if(c>='A')
  172.             c -= 7;
  173.         c -= '.';
  174.         for(j=0;j<6;j++){
  175.             block[6 * i + j] = (c & 0x20) ? 1 : 0;
  176.             c <<= 1;
  177.         }
  178.     }
  179.  
  180.     for(i=0;i<64;i++)
  181.         L[i] = 0;
  182.  
  183.     /* Inverse of Fperm */
  184.     for(i=0; i<64; i++)
  185.          L[FP[i]] = block[i];
  186.  
  187.     for(i=0;i<48;i++)
  188.         tmpE[i] = 0;
  189.  
  190.     for(i=0;i<32;i++)
  191.         tmpE[1 + (i & 03) + 6 * (i >> 2)] = R[i];
  192.  
  193.     l = 0;
  194.  
  195.     for(i=0;i<24;i++){
  196.         l <<= 1;
  197.         l |= tmpE[47-i];
  198.     }
  199.  
  200.     out96[3] = tfTOsixbit(l);
  201.     out96[3] = ((out96[3] & 0x00ff00ff) << 2) | (out96[3] & 0xff00ff00);
  202.  
  203.     l = 0;
  204.  
  205.     for(i=0;i<24;i++){
  206.         l <<= 1;
  207.         l |= tmpE[23-i];
  208.     }
  209.  
  210.     out96[2] = tfTOsixbit(l);
  211.     out96[2] = ((out96[2] & 0x00ff00ff) << 2) | (out96[2] & 0xff00ff00);
  212.  
  213.  
  214.     for(i=0;i<48;i++)
  215.         tmpE[i] = 0;
  216.  
  217.     for(i=0;i<32;i++)
  218.         tmpE[1 + (i & 03) + 6 * (i >> 2)] = L[i];
  219.  
  220.     l = 0;
  221.  
  222.     for(i=0;i<24;i++){
  223.         l <<= 1;
  224.         l |= tmpE[47-i];
  225.     }
  226.  
  227.     out96[1] = tfTOsixbit(l);
  228.     out96[1] = ((out96[1] & 0x00ff00ff) << 2) | (out96[1] & 0xff00ff00);
  229.  
  230.     l = 0;
  231.  
  232.     for(i=0;i<24;i++){
  233.         l <<= 1;
  234.         l |= tmpE[23-i];
  235.     }
  236.  
  237.     out96[0] = tfTOsixbit(l);
  238.     out96[0] = ((out96[0] & 0x00ff00ff) << 2) | (out96[0] & 0xff00ff00);
  239.  
  240.     l = getsaltval(s);
  241.     l = ((l & 0x00ff00ff) <<2) | (l & 0xff00ff00);
  242.     return(l);
  243. }
  244.